package com.tsy.server.wayline.service;

import com.tsy.server.component.mqtt.model.EventsReceiver;
import com.tsy.server.wayline.model.dto.ConditionalWaylineJobKey;
import com.tsy.server.wayline.model.dto.WaylineJobDTO;
import com.dji.sdk.cloudapi.wayline.FlighttaskProgress;

import java.util.Optional;

/**
 * @author sean
 * @version 1.4
 * @date 2023/3/24
 */
public interface IWaylineRedisService {

    /**
     * 保存机场执行的航线任务状态到 Redis。
     * @param dockSn 机场SN
     * @param data 运行数据
     */
    void setRunningWaylineJob(String dockSn, EventsReceiver<FlighttaskProgress> data);

    /**
     * 查询 Redis 中机场执行的航线任务状态。
     * @param dockSn 机场SN
     * @return
     */
    Optional<EventsReceiver<FlighttaskProgress>> getRunningWaylineJob(String dockSn);

    /**
     * 删除 Redis 中机场执行的航线任务状态。
     * @param dockSn 机场SN
     * @return
     */
    Boolean delRunningWaylineJob(String dockSn);

    /**
     * 保存机场暂停的航线任务到 Redis。
     * @param dockSn 机场SN
     * @param jobId 任务ID
     */
    void setPausedWaylineJob(String dockSn, String jobId);

    /**
     * 查询 Redis 中机场暂停的航线任务ID。
     * @param dockSn 机场SN
     * @return
     */
    String getPausedWaylineJobId(String dockSn);

    /**
     * 删除 Redis 中机场暂停的航线任务。
     * @param dockSn 机场SN
     * @return
     */
    Boolean delPausedWaylineJob(String dockSn);

    /**
     * 保存机场阻塞的航线任务到 Redis。
     * @param dockSn 机场SN
     * @param jobId 任务ID
     */
    void setBlockedWaylineJob(String dockSn, String jobId);

    /**
     * 查询 Redis 中机场阻塞的航线任务ID。
     * @param dockSn 机场SN
     * @return
     */
    String getBlockedWaylineJobId(String dockSn);

    /**
     * 保存机场的条件航线任务到 Redis。
     * @param waylineJob 任务
     */
    void setConditionalWaylineJob(WaylineJobDTO waylineJob);

    /**
     * 查询 Redis 中机场的条件航线任务。
     * @param jobId 任务ID
     * @return
     */
    Optional<WaylineJobDTO> getConditionalWaylineJob(String jobId);

    /**
     * 删除 Redis 中机场的条件航线任务。
     * @param jobId 任务ID
     * @return
     */
    Boolean delConditionalWaylineJob(String jobId);

    Boolean addPrepareConditionalWaylineJob(WaylineJobDTO waylineJob);

    Optional<ConditionalWaylineJobKey> getNearestConditionalWaylineJob();

    Double getConditionalWaylineJobTime(ConditionalWaylineJobKey jobKey);

    Boolean removePrepareConditionalWaylineJob(ConditionalWaylineJobKey jobKey);
}
